﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace MySkin.Tools
{
    class Win32Message
    {
        #region   win32部分消息
        public const int WM_CREATM = 0x0001;             //应用程序创建一个窗口
        public const int WM_ERASEBKGND = 0x0014;         //当窗口背景必须被擦除时（例在窗口改变大小时）
        public const int WM_KEYDOWN = 0x0100;            //按下键盘中的一个键 
        public const int WM_KEYUP = 0x0101;              //释放一个键
        public const int WM_CTLCOLOREDIT = 0x133;        //当一个编辑型控件将要被绘制时发送此消息给它的父窗口；
                                                         //通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色

        public const int WM_PAINT = 0xF;                 //窗体水平或是垂直发生变化时，才进行重画
        public const int WM_NCLBUTTONDOWN = 0x00A1;      //当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
        public const int WM_NCHITTEST = 0x0084;          //光标移动到窗体，移动鼠标，按住或释放鼠标时发生; 
        public const int WM_LBUTTONDOWN = 0x0201;           //鼠标左键按下
        //窗体的上下左右
        public const int HTLEFT = 10;
        public const int HTRIGHT = 11;
        public const int HTTOP = 12;
        public const int HTTOPLEFT = 13;
        public const int HTTOPRIGHT = 14;
        public const int HTBOTTOM = 15;
        public const int HTBOTTOMLEFT = 0x10;
        public const int HTBOTTOMRIGHT = 17;
        public const int HTCAPTION = 2;                      //窗体的非客户区
        public const int HTCLIENT = 1;                      // 窗体的客户区

        public const int WM_FALSE = 0;
        public const int WM_TRUE = 1;

        public const int WM_SYSCOMMAND = 0X112;//274
        public const int SC_MAXIMIZE = 0XF030;//61488
        public const int SC_MINIMIZE = 0XF020;//61472
        public const int SC_RESTORE = 0XF120; //61728
        public const int SC_CLOSE = 0XF060;//61536
        public const int SC_RESIZE_Horizontal = 0XF002;//61442
        public const int SC_RESIZE_Vertical = 0XF006;//61446
        public const int SC_RESIZE_Both = 0XF008;//61448
        #endregion

        #region 调用com组件外部方法，实现互操作。
        [DllImport("gdi32.dll")]
        //创建带圆角的矩形区域
        public static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3);
        [DllImport("user32.dll")]
        //设置一个窗口的区域.只有被包含在这个区域内的地方才会被重绘,
        //而不包含在区域内的其他区域系统将不会显示.
        //hrgn为设置的重绘区域
        public static extern int SetWindowRgn(IntPtr hwnd, IntPtr hRgn, Boolean bRedraw);
        [DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)]
        //该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板，释放所有与该对象有关的系统资源，
        //在对象被删除之后，指定的句柄也就失效了。
        // 逻辑笔、画笔、字体、位图、区域或者调色板的句柄
        public static extern int DeleteObject(IntPtr hObject);

        [DllImport("user32.dll")]
        //该函数将指定的消息发送到一个或多个窗口
        //返回值指定消息处理的结果，依赖于所发送的消息
        //Msg：指定被发送的消息。
        //wParam：指定附加的消息特定信息。
        //IParam：指定附加的消息特定信息。
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        //该函数从当前线程中的窗口释放鼠标捕获，并恢复通常的鼠标输入处理。
        //捕获鼠标的窗口接收所有的鼠标输入（无论光标的位置在哪里），除非点击鼠标键时，
        //光标热点在另一个线程的窗口中。
        public static extern bool ReleaseCapture();
        #endregion
    }
}
